using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using DominioSATT;
using RepositorioSATT.Conexiones;


namespace RepositorioSATT
{
    public class PersonaRepositorio:IPersonaRepositorio,IMapeadorFila<Persona>, ITipoPersonaRepositorio
    {
        protected Conexion conn;
        protected string sql = "";
        
        public PersonaRepositorio()
        {
            conn = new Conexion();
        }
        
        #region Miembros de IMapeadorFila<Persona>

        public Persona MapearTabla(DataRow fila)
        {
            Persona nPersona = null;
            if (fila != null)
            {
                //Atributos del Agregate Root
                Pais nNac = new Pais();
                int DNI = (fila.IsNull("Dni") == true ? 0 : Convert.ToInt32(fila["Dni"]));
                string Nombre = (fila.IsNull("Nombre") == true ? string.Empty : Convert.ToString(fila["Nombre"]));
                string Apellido = (fila.IsNull("Apellido") == true ? string.Empty : Convert.ToString(fila["Apellido"]));
                DateTime FechaNacimiento = (fila.IsNull("FechaNac") == true ? DateTime.Now : Convert.ToDateTime(fila["FechaNac"]));
                string Tipo = (fila.IsNull("Tipo")==true? string.Empty : Convert.ToString(fila["Tipo"]));
                string Sexo = (fila.IsNull("Sexo") == true ? string.Empty : Convert.ToString(fila["Sexo"])); 
                bool Estado = (fila.IsNull("Estado") == true ? false : Convert.ToBoolean(fila["Estado"]));
                int DniTutor = (fila.IsNull("Tutor") == true ? 0 : Convert.ToInt32(fila["Tutor"]));
                string Relacion = (fila.IsNull("Relacion") == true ? string.Empty : Convert.ToString(fila["Relacion"])); 
                IPaisRepositorio PaisRepo = new UbicacionRepositorio();
                nNac.Nombre=PaisRepo.ObtenerPais(Convert.ToInt32( fila["IdPais"]));

                //Atributos del Value Object Domicilio
                Localidad nLoc = new Localidad();
                Pais nPais = new Pais();
                Provincia nProv = new Provincia();                
                ILocalidadRepositorio Ubicacion = new UbicacionRepositorio();
                nLoc.Nombre=Ubicacion.ObtenerLocalidad(Convert.ToInt32( fila["IdLocalidad"]));
                nProv.Nombre=Ubicacion.ProvinciaLocalidad(Convert.ToInt32( fila["IdLocalidad"]));
                nPais.Nombre=Ubicacion.PaisLocalidad(Convert.ToInt32( fila["IdLocalidad"]));
                
                string Direccion = (fila.IsNull("Direccion") == true ? string.Empty : Convert.ToString(fila["Direccion"]));
                Domicilio domicilio = new Domicilio(nPais, nProv, nLoc,Direccion);

                //Atributos del Value Object Contacto
                string Telefono = (fila.IsNull("Telefono") == true ? string.Empty : Convert.ToString(fila["Telefono"]));
                string Celular = (fila.IsNull("Celular") == true ? string.Empty : Convert.ToString(fila["Celular"]));
                string Email = (fila.IsNull("Email") == true ? string.Empty : Convert.ToString(fila["Email"]));
                Contacto contacto = new Contacto(Telefono,Celular,Email);
                                                    
             nPersona = new Persona(DNI,Nombre,Apellido,FechaNacimiento,Tipo,nNac,contacto,domicilio,Sexo,Estado);
             nPersona.DniTutor = DniTutor;
             nPersona.Relacion = Relacion;
            }
            return nPersona;
        }

        #endregion

        #region Miembros de IPersonaRepositorioSATT

        public Persona Obtener(int Dni)
        {
        
            sql = " Select * From Persona Where DNI = " + Dni;
            DataRow dr = conn.Buscar(sql);
            return this.MapearTabla(dr);
        }

        public List<Persona> Listar()
        {
            sql = " Select * From Persona ";
            List<Persona> ListaPersonas = new List<Persona>();
            DataTable dt = conn.Listar(sql);
            foreach (DataRow dr in dt.Rows)
                ListaPersonas.Add(this.MapearTabla(dr));
            return ListaPersonas;
        }

        public List<Persona> Listar(string tipo)
        {
            sql = " Select * From Persona ";
            List<Persona> ListaPersonas = new List<Persona>();
            DataTable dt = conn.Listar(sql);
            foreach (DataRow dr in dt.Rows)
                if (dr["Tipo"].ToString().Contains(tipo) && Convert.ToBoolean( dr["Estado"])==true)
                {
                    ListaPersonas.Add(this.MapearTabla(dr));
                }
                    return ListaPersonas;
        }
        /// <summary>
        /// Agrega a la base de datos una persona nueva
        /// </summary>
        /// <param name="Objeto"></param>
        public void Agregar(Persona Objeto)
        {
            string campos = "Dni,Nombre,Apellido,FechaNac,Tipo,IdPais,Telefono,Celular,Email,Sexo,IdLocalidad,Direccion,Estado,Tutor,Relacion";
            string valores = Objeto.Dni + ",'" +
                Objeto.Nombre + "','" +
                Objeto.Apellido + "','" +
                string.Format("{0:yyyyMMdd}",Objeto.FechaNac.ToShortDateString()) + "','" +
                Objeto.TipoPersona + "'," +
                Objeto.Nacionalidad.Id + ",'" +
                Objeto.Contacto.Telefono + "','" +
                Objeto.Contacto.Celular + "','" +
                Objeto.Contacto.Email + "','" +
                Objeto.Sexo+"',"+
                Objeto.Domicilio.Localidad.Id + ",'" +
                Objeto.Domicilio.Direccion + "','" +
                Objeto.Estado+"'," +
                Objeto.DniTutor + ",'" +
                Objeto.Relacion + "'";
            conn.AgregarSinId("Persona", campos, valores);
        }
        /// <summary>
        /// Modifica los datos de una persona en la base de datos
        /// </summary>
        /// <param name="Objeto"></param>
        public void Actualizar(Persona Objeto)
             
        {//UPDATE TABLA SET CAMPO = VALOR, CAMPO = VALOR WHERE CONDICION = VALOR
            string ActualizaSql = "UPDATE PERSONA SET Nombre='"+Objeto.Nombre+
                                                        "',Apellido='"+Objeto.Apellido+
                                                        "',FechaNac='" + string.Format("{0:yyyyMMdd}",Objeto.FechaNac.ToShortDateString()) +
                                                        "',IdPais="+Objeto.Nacionalidad.Id+
                                                        ",IdLocalidad="+Objeto.Domicilio.Localidad.Id+
                                                        ",Direccion='"+Objeto.Domicilio.Direccion+
                                                        "',Telefono='"+Objeto.Contacto.Telefono+
                                                        "',Celular='"+Objeto.Contacto.Celular+
                                                        "',Email='"+Objeto.Contacto.Email+
                                                        "',Tipo='"+Objeto.TipoPersona+
                                                        "',Sexo='"+Objeto.Sexo+
                                                        "',Estado='"+Objeto.Estado.ToString()+
                                                        "',Tutor=" + Objeto.DniTutor + 
                                                        ",Relacion='" + Objeto.Relacion +
                                                        "' where Dni="+Objeto.Dni;
            conn.ActualizarOEliminar(ActualizaSql);
        }

        public void Inactivar(int Dni)
        {
            throw new NotImplementedException();
        }

        public DataTable ListadoPersona(string tipo)
        {
            sql = " SELECT Dni,P.Nombre + ' ' + Apellido as Apellido,Telefono,Direccion,l.Nombre as Localidad FROM PERSONA P INNER JOIN LOCALIDADES L ON P.IDLOCALIDAD = L.IDLOCALIDAD where p.tipo like '%" + tipo + "%' ";
            DataTable dt = conn.Listar(sql);
            return dt;
        }

        #endregion

        #region ITipoPersonaRepositorio Members

        public List<Persona> ListarTutores()
        {
            throw new NotImplementedException();
        }

        #endregion

    }
}

